Perl est un langage généraliste créé en 1987 par Larry Wall.
« Perl continue de prospérer dans sa quatrième décennie grâce à une communauté d’utilisateurs et de développeurs très dynamique. », dixit perldelta.
Perl est distribué sous une double licence : Artistic Licence et GPL v1+. La plupart des modules du CPAN suivent également ce même traitement.
« Perl 5 raptor » de kraih, licence CC BY‑SA 4.0
Tout d’abord un petit lien vers la précédente dépêche sur la sortie de Perl 5.30.0 qui explique en particulier le « releasing flow » et des termes spécifiques à la communauté Perl (blead, pumpking, etc.).
Sommaire
-
Rétrospective de 2019 et même un peu plus, morceaux sélectionnés
- Les Perl porters migrent vers GitHub
- Version majeure de Request Tracker
- Programmation orientée objet native bientôt intégrée dans le cœur de Perl
- Nouveau livre de briand d foy
- Nouveau livre : compilation d’articles techniques
- Nouveau livre pour débutants Perl
- Perl School
- Pilote officiel mongodb abandonné
- Sortie de Tau Station
- PullRequestClub
- PerlWeeklyChallenge
- Cnext
- Perl 5 => Perl, Perl 6 => Raku
- Nouvel installeur de l’interpréteur perl (en bash)
- Toujours plus de Continuous Integration Perl
- Audrey Tang
- Développement de Perl
- CHANGELOGS
- Sortie de Perl 5.30
Rétrospective de 2019 et même un peu plus, morceaux sélectionnés
Les Perl porters migrent vers GitHub
Les développeurs de Perl 5, sous l’impulsion de leur pumpking (mainteneur en chef) Sawyer X, ont décidé de migrer le dépôt ainsi que le gestionnaire de tickets de Perl 5 vers GitHub.
Cela a consisté en deux choses :
- migrer le code depuis perl5.git.perl.org vers Perl 5 sur GitHub ; le dépôt GitHub existait déjà en miroir, le dépôt principal devient donc le miroir et le miroir devient le dépôt principal :D ;
- migrer les tickets depuis Perl Request Tracker vers GitHub issue tracker, ça peut paraître simple, mais il y avait beaucoup de tickets et a fallu « scripter » pour récupérer et réinjecter les tickets (pour modifier les URL par exemple).
Version majeure de Request Tracker
L’entreprise Best Practical fondée par Jesse Vincent (un dev Perl très reconnu et ancien Perl Pumpking) derrière le logiciel professionnel de ticketing Request tracker a annoncé l’arrivée imminente de la version 5 puis la disponibilité de la 5.0.0 beta 1.
Cette version contient notamment la migration vers Bootstrap en tant que cadriciel CSS et le passage à chart.js pour les graphiques.
Request Tracker est un géant de la gestion de tickets d’incident, utilisé par de très nombreuses industries dans le monde entier. C’est un logiciel de gestion de tickets d’incident de qualité professionnelle, sous licence GPL v2 (code source), avec des possibilités infinies de personnalisations et d’interfaçage.
Vous pouvez trouver le code source sur le dépôt GitHub, ainsi que de la doc et du support français, par Easter‑Eggs, qui est une entreprise française du Numérique libre.
Longue vie a RT5 !
Programmation orientée objet native bientôt intégrée dans le cœur de Perl
L’année 2019 a été également celle d’un travail sur le module Cor, qui veut apporter l’orienté objet dans le cœur de Perl. En effet, Perl permet de simuler facilement l’orienté objet depuis toujours avec les notions de packages et les tie/bless, mais ce n’est pas hyper élégant.
De nombreux très bons modules ont ainsi été créés pour combler ce défaut (Moo, Moose, Mouse, etc.).
Cor est une tentative dirigée par Curtis Ovid Poe d’inclure ces fonctionnalités dans le cœur de Perl. La spécification est collaborative sur son Gist GitHub.
Plus d’infos :
Nouveau livre de briand d foy
Pour celles et ceux qui ne connaissent pas, le cadriciel Web Mojolicious est une véritable pièce de maître qui n’a rien à envier aux Django, RoR, Flask ou ChoisissezCeQueVousVoulez.
C’est d’ailleurs bien plus qu’un framework web… Plutôt un framework de développement. Par exemple, la prochaine version majeure de Bugzilla sera notamment réécrite avec .
Mojolicious est un travail communautaire initié par Sebastian Riedel (OpenSuse) qui était également le créateur du cadriciel Catalyst (cadriciel Web MVC).
Un membre très reconnu de la communauté Perl brian d foy (sic) a écrit un livre sur les clients Web écrits avec Mojolicious.
Nouveau livre : compilation d’articles techniques
Sortie de The best of Perl Hacks par Dave Cross.
C’est une sorte de recueil de billets de blogs sélectionnés (comme furent en leurs temps les « Best of Perl Journal » qui étaient en plusieurs volumes !).
Dave Cross est un expert du largage Perl et il a tenu pendant des années un blog technique.
Il a décidé de sélectionner les meilleurs articles des dix dernières années pour les compiler dans un livre.
Nouveau livre pour débutants Perl
Sortie du nouveau livre Perl Taster: Your First Two Hours With Perl, toujours par Dave Cross.
Ce livre cible les débutants en Perl.
Perl School
Les trois livres vus précédemment font partie de PerlSchool qui est une sorte de « maison d’édition indépendante de livres dématérialisés ».
D’autres livres sont sortis (moins récemment) sous le giron de PerlSchool :
- Selenium and Perl, par John Davies ;
- Cucumber and Perl, par John Davies ;
- Learning Perl excercises, par brian d foy.
Pilote officiel mongodb abandonné
Après avoir fait grincer des dents la communauté open source dans son ensemble avec son changement de licence vers SSPL (on en a d’ailleurs parlé dans un journal sur LinuxFr.org), MongoDB s’est mis une partie des développeurs Perl à dos en abandonnant son pilote officiel pour Perl.
Ceux qui travaillaient avec MongoDB en Perl ne vont pas le regretter, car le pilote n’était de toute façon souvent pas à jour et une implémentation non officielle (module pure-perl Mango) existait déjà.
L’ancien dev de l’implémentation pure Perl du pilote MongoDB Mango (Sebastian Riedel… encore lui !) a répondu à cette nouvelle par un cinglant « bon débarras ».
Par le passé, il avait déjà rapporté que le développement de mango était un calvaire car MongoDB ne lui fournissait pas l’aide nécessaire et qu’il était obligé de lire le code des pilotes officiels dans d’autres langues.
Si vous utilisiez ou envisagiez d’utiliser MongoDB parce que… c’est un peu « hype », un conseil donc, FUYEZ !
Sortie de Tau Station
Tau Station est selon son équipe de développement un jeu en mode texte massivement multijoueur dans un navigateur.
Il est décrit en français dans ce billet de blog de Sandro Cazzaniga.
Il est gratuit… Allez tester cette pépite : TauStation
PullRequestClub
Suite au défunt CPAN Pull Request Challenge, une autre équipe a mis en place le PullRequestClub.
C’est un site Web (code source) qui consiste à encourager les développeurs à faire des pull requests en mettant en relation mainteneurs gentils avec développeurs motivés. Je trouve que ça ressemble un peu dans l’esprit à Hacktoberfest.
PerlWeeklyChallenge
Les développeurs Perl ont toujours aimé s’amuser en programmant avec des petits défis (Perl golf, japhs, poésie Perl, code obfusqué…).
xkcd (lien) — Licence CC BY‑NC
Une compétition amicale a été mise en place récemment et connaît un grand succès, il s’agit du PerlWeeklyChallenge !
Cette initiative qui propose des challenges d’algorithmique en Perl ou Raku (ou parfois d’autres langages) a clairement marqué l’année 2019.
Cette initiative, orchestrée de main de maître par Mohammad Anwar (de Perl Weekly) consiste à remplir des petits « défis » hebdomadaires.
Un seul mot pour terminer sur ce sujet… Un grand merci Mohammad !
Cnext
cnext est un nouveau client CPAN.
L’approche de ce client est différente de cpanminus ou cpm car il ne cible pas l’architecture des serveurs CPAN mais GitHub. L’index est dans un dépôt github (pause-index).
Plus d’infos sur l’index dans la doc de next-indexes.
À noter que cpanminus utilise aussi un index alternatif metaDB et qu’il en existe plusieurs autres.
cnext n’est aujourd’hui pas encore fonctionnel.
Perl 5 => Perl, Perl 6 => Raku
2019 a également connu le renommage de Perl 6 en Raku.
Je n’en dis pas plus, on y reviendra peut-être dans une dépêche dédiée (?) (need help).
Nouvel installeur de l’interpréteur perl (en bash)
Parmi les perlbrew
, plenv
etc. voici un petit nouveau : perl-install.
L’idée étant d’implémenter l’installeur en bash
pour pouvoir installer sur des machines ne disposant pas de Perl.
Perl est partout me direz-vous… Oui mais après l’annonce d’Apple de ne pas fournir les interpréteurs pour ruby
, python
et perl
dans leur OS de base, c’est potentiellement un nouveau besoin d’avoir un installeur dans un langage encore supporté.
Toujours plus de Continuous Integration Perl
En plus des vénérables travis, circle ci, appveyor, gitlab ci, l’année 2019 a vu fleurir quelques github actions pour perl : installer avec cpm, installer avec cpanminus, environement Perl et Perl Critic
Les images officielles pour perl : dockerhub Perl
J’en profite pour placer quelques liens vers des helpers (GitHub actions ou d’autres infrastructures) :
Audrey Tang
Audrey Tang est une membre respectée et programmeuse géniale qui a eu beaucoup d’influence sur Perl et Raku. Elle occupe depuis quelques années un poste de ministre à Taïwan.
C’est une personnalité au parcours atypique et précoce : elle fut la plus jeune ministre sans portefeuille de Taïwan et elle travaille notamment sur le développement de logiciels libres dans le domaine social et le domaine de l’accès du public aux données.
Parmi ses travaux notables, on trouve Pugs et EtherCalc (et pas mal d’autres comme Module::Install, des contributions à Request Tracker vu plus haut, SVK, PAR, Slash etc.)
Développement de Perl
Releasing flow
Pour le releasing flow en général, se référer à la dépêche sur Perl 5.30.0 qui détaille plus les notions comme blead, pumpking ou encore le schéma de versioning.
Perl 5.30.0 a été publié en mai 2019 et le pumpking était Sawyer X.
Pour Perl 5.32.0, pas de changement, le mainteneur en chef reste le même mais les mainteneurs de versions de développement varient d’où cet appel à volontaires en début de cycle de développement.
Ensuite durant une année, des versions de développement (version perl 5.impair.sousversion) sont publiées chaque mois.
L’intégration de code dans la branche de développement passe des tests de compilation (github action dans le dépôt, matrice d’options configure
, make
, make test
) et des « smoke tests » (des tests dans des VMs). Enfin, après chaque sortie de version de developpement, un rapport de test de la « rivière CPAN » (ensemble de 3000 modules CPAN dont beaucoup d’autres modules dépendent) est exécuté et sert également pour vérifier les non-régressions.
Il n’y a pas de date de sortie décidée pour la version stable, donc elle sort quand elle est prête.
Lors du développement de perl 5.30.0, les versions de dev s’étaient arrêtées à 5.29.10
, cette fois les versions de dev s’étalent un tout petit peu plus (5.31.11
). En mars Sawyer X a décidé de décaler la 5.31.11 d’une semaine et de faire une nouvelle version de dev et de décaler d’un mois la sortie de la version stable.
Finalement il n’y aura pas eu de 5.31.12
mais une 5.32.0-RC0
le 30 mai.
Voici une frise représentative des versions :
Précédentes dépêches sur les sorties des versions de Perl
- Sortie de Perl 5.10 en 2007.
- Sortie de Perl 5.12 en 2010.
- Sortie de Perl 5.14 en 2011.
- Sortie de Perl 5.16 en 2012.
- Sortie de Perl 5.18, 5.20 et 5.22 (5.18 en 2013, 5.20 en 2014, 5.22 en 2015).
- Sortie de Perl 5.24, 5.26, 5.28 et 5.30 (5.24 en 2016, 5.26 en 2017, 5.28 en 2018, 5.30 en 2019).
CHANGELOGS
Perl 5.32.0 est sorti le 20 juin (annonce).
Place maintenant aux différents CHANGELOG ou perldelta qui n’ont pas été traités sur LinuxFR.
Sortie de Perl 5.30
La version 5.30.0 a déjà été traitée dans la dépêche sortie de perl 5.30, on passe donc directement à la version suivante qui est la version patch 5.30.1.
5.30.1
Mise à jour des modules
- Seulement Module::Corelist qui contient la liste des modules (autant dire aucun changement)
Compilation
Un correctif concernant OpenBSD, FreeBSD et Solaris qui concerne la macro
ECHO
lorsqu’on souhaite utiliserdtrace
. Le configure de Perl ne définit pas correctement cette variable, mais elle est généralement définie par lemake
du système. Pour avoir le problème, il faut être par exemple sur une Solaris et configurer avec-Dusedtrace
. Le correctif se trouve dans leMakefile.SH
.Les tests de locale sont en erreur sur Windows à cause d’un double bogue (côté Windows). La solution pour corriger a été de faire plus de conversions en Perl et de laisser moins de travail à Windows.
Corrections
Groupes effectifs
Un correctif sur le setter de la variable $)
(si on a les privilèges de le faire). La variable $) permet d’accéder aux effective groups. Par exemple :
perl -e "print $)"
Nous donnera :
1000 4 24 27 30 46 116 126 999 1000 1001
Et pour info voici la sortie de id
:
uid=1000(johndoe) gid=1000(johndoe) groups=1000(johndoe),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),999(docker),1001(usb)
Parmi les autres variables en Perl pour accéder à ce type d’infos (et qu’on peut utiliser pour potentiellement baisser les privilèges) :
-
$<
, identifiant utilisateur réel ; -
$>
, identifiant utilisateur effectif ; -
$(
, identifiant de groupe réel ; -
$)
, identifiant de groupe effectif (on vient d’en parler).
Autres
Correction d’un bogue avec
readline
qui évalue en contexte de liste alors qu’il n’attend qu’une seule valeur de retour. La fonctionreadline
en Perl permet de jouer avec les handles de fichiers (my $line = <STDIN>
est équivalent àmy $line = readline(STDIN);
)Un bogue mystérieux avec la gestion des signaux et sv_gets
Une fuite de mémoire lorsqu’on essaye de faire une correspondance d’expression rationnelle entre une chaîne non explicitement marquée UTF‑8 et un caractère Unicode. Le cas d’exemple est
"a" =~ /\N{U+2129}/ while 1;
et le code voit qu’il y a un problème de correspondance, mais il manque un retour de fonction.Correction d’un débordement de tampon (buffer overflow) lorsqu’on se sert de précision négative
sprintf("%.*a", -10000, $x)
(pourquoi faire ça ?)correction d’un bogue sur l’appel de
scalar
et le multidéréférencement qui posait un problème d’assertion dans l’étape de compilation.
5.30.2
Compilation
MYMALLOC
Le build de MYMALLOC
sur Windows a été corrigé. MYMALLOC est l’implémentation Perl de malloc
.
On peut l’utiliser si on donne -Dusemymalloc
à Configure
:
/* This file contains Perl's own implementation of the malloc library.
* It is used if Configure decides that, on your platform, Perl's
* version is better than the OS's, or if you give Configure the
* -Dusemymalloc command-line option.
*/
Autres
- prise en charge de GCC 10 !
Corrections
printf %n
Correction d’un bogue avec le très spécial format %n de printf
et sprintf
.
D’habitude on utilise printf
pour afficher et formater un argument dans une chaîne, mais là c’est différent et on va pouvoir stocker l’emplacement dans la chaîne pour le stocker dans un argument.
D’après la doc de sprintf :
%n special: *stores* the number of characters output so far into the next argument in the parameter list
Voici un exemple :
perl -e 'printf("123 %n 456 -> ", $count); print $count;'
va produire
123 456 -> 4
Le bogue était lié à l’utilisation conjointe de %n
et d’UTF‑8 (produisant une mauvaise valeur) avec un Perl ayant l’option de débogage activée (dans ce cas Perl se mettait à paniquer).
Et pendant qu’on y est :
Don’t fall into the trap of using a printf when a simple print would do. The print is more efficient and less error prone.
Autres
Correctif d’une fuite mémoire après une refactorisation des classes de caractères dans les expressions rationnelles (
m/[...]/
). Le problème a été introduit en 5.26. Ce correctif est marqué comme candidat à être répercuté sur des versions correctives de 5.26 et 5.28correction d’un bogue dans les propriétés Unicode
qr/\p{nv:qnan}/
.\p{...}
introduit une propriété Unicode. Ici de la forme\p{nom:valeur}
.nv
est un double et donc ça veut dire « Numeric Value is Not a Number ». Il s’agissait d’un heap buffer overflowCorrection d’une assertion failure dans les expressions rationnelles avec script run (
(sr:...)
incomplets.Une limitation de l’exécution de code récursif dans les expressions rationnelles (
(?{ code })
et(??{ code })
) est mieux gérée. En effet, le code profondément récursif émettait un warning. Le correctif consiste à n’appliquer la limitation plus qu’à(??{ code })
(évalue le retour du code embarqué).
5.31.1
Améliorations du cœur de Perl
Interdiction d’utiliser
vec
et les opérationsbitwise
sur les caractères Unicode après0xff
. Ça ne fait aucun sens, car ce sont des opérations bit à bit et les codes au‑delà de 0xff sont représentés en UTF‑8.Sys::Hostname::hostname()
n’accepte plus d’argument (déprécié depuis 5.28)
Mise à jour des modules
Storable
Mise à jour de Storable pour régler un problème de clone. Storable est un module qui permet de sérialiser et faire persister les structures de données Perl de façon rapide, compacte (binaire) et portable.
Le bogue est tiré par les cheveux, il faut combiner affaiblissement de référence + expression rationnelle compilée dans une variable + autovivication + clone en profondeur.
Comme ceci :
my $foo = [qr//,[]];
weaken($foo->[1][0][0] = $foo->[1]);
dclone $foo;
Autres
Correction sur le module IO. La fonction sendto n’utilisait pas la « to » et donc ignorait l’adresse paire
Pod::Parser est supprimé du core mais reste évidemment accessible grâce au CPAN
Compilation
Le script autodoc.pl a été fortement remanié
Fin du support du build pour Windows CE
Corrections
Sub Zero
Une parenthèse fermante fallacieuse (sans ouvrante correspondante) pouvait poser problème dans un sub parse.
Un sub parse est une analyse dans une expression rationnelle comme my $str =~ s/(41)/$1+1/e
qui va remplacer 41 par 42 avec une analyse de $1+1
pour faire 41+1=42
. Ce comportement est activé par le modificateur /e
(evaluate).
Le problème c’était, qu’en interne, des parenthèses étaient parfois ajoutées dans la construction de l’arbre pour aider l’analyseur, et la parenthèse fermante pouvait alors interférer.
La solution est d’ajouter un symbole virtuel qui ne peut pas être écrit dans le source.
Autres
Un correctif dans PerlIO concernant les descripteurs de fichier et la fonction
close
Comme documenté
%{^CAPTURE_ALL}
est a présent un alias de%-
et non%+
(erreur)Un autre bogue sur
%{^CAPTURE}
et@{^CAPTURE}
. Comme vous le savez peut‑être (pas) en Perl$var
est différent de@var
qui est différent de%var
. Le hash%{^CAPTURE}
était vide si l’on avait appelé@{^CAPTURE}
avant (et inversement).Correction d’un integer overflow sur des valeurs extrêmement grandes de nombres à virgule flottante (pas grand en taille mais en nombre de chiffres après la virgule). Le correctif consiste à tester la taille.
Mauvais analyse lexicale des
0x
ou0b
incomplets (sans rien après).print -e 'print 0x - 1'
produit1
…Le sub parsing a été également amélioré en règle générale pour accepter plus de choses qui sont acceptées par le parsing standard
Correction d’un bogue dans l’affectation des références de code (
\&f1 = \&f2
) dans le package par défaut (main::
).
5.31.2
Améliorations du cœur de Perl
Total annihilation
Il existe une variable d’environnement PERL_DESTRUCT_LEVEL qui permet de forcer l’interpréteur à libérer à la fin de son exécution tout ce qu’il a alloué, ce qui permet de simuler en quelque sorte la gestion mémoire par région (et d’éviter les fuites de mémoires).
Lorsque cette variable n’est pas définie, Perl laisse le soin à exit
de faire ce travail.
L’amélioration consiste à prendre en compte cette variable même lorsque l’interpréteur n’a pas été compilé en mode débogage.
Autres
Nouvelle erreur No digits found for %s literal lorsqu’on écrit en base hexa (
0x…
) ou binaire (0b…
) quelque chose qui n’est pas de l’hexa ou du binaireMeilleure gestion de la propagation des signaux critiques dans les
eval
Correction d’un bogue dans les blocs
CHECK
,BEGIN
, etc., il s’agit d’un problème de gestion d’exit
.De nombreuses fonctions récursives pour parcourir l’arbre des opérateurs pendant la compilation ont été déroulées, ça permet d’être moins agressif avec la pile (perf ?).
Compilation
Support de Bison (le générateur d’analyseur syntaxique) versions 3.1 jusqu’à 3.4
Correction mineure du Configure avec
clang
.-Duse64bitint
devient la valeur par défaut si on compile sur VMSProblème de compilation avec VC++ 6.0 qui ne sera pas corrigé, car le support va être arrêté.
Corrections
Des corrections en lien avec l’amélioration de la gestion des signaux dans les
eval
, la gestion des0x…
et0b…
et lesexit
dans les blocs d’INITCorrection concernant les ouvertures de fichiers temporaires
open my $fh, ">>+", undef
; la correction de ce bogue est ce qui a cassé la compilation VC++6Correction d’une erreur de segmentation mémoire (SEGV) avec le déréférencement multiple (récursive) dans les expressions rationnelles (avec
*
, par exemple)
5.31.3
Améliorations du cœur de Perl
Range et conversions implicites
L’opérateur range
gère mieux les conversions implicites.
L’opérateur range est ..
et il permet de faire des choses simples comme
print 1..10
qui va générer une liste de 1 à 10 :
12345678910
Ou il peut faire des choses comme
"ab".."ba"
qui va donner
ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba
Dans le cas de "0"".."-1"
, on générait avant une liste de 0 jusqu’à 99 et maintenant ça sera une liste vide.
Keep the stuff left
\K
est à présent interdit dans les assertions lookbehind et lookahead car :
- le comportement est cassé :
- personne ne peut dire quel est le comportement attendu.
\K
est "Keep the stuff left of the \K, don't include it in $&"
Matcher sans garder.
C’est déjà en soi un lookbehind
, l’inclure dans un autre lookbehind
était donc tiré par les cheveux.
Autres
Nouvelle fonction
parse_subsignature()
qui permet d’aller plus loin dans l’implémentation des signaturesDe nouvelles macros pour gérer de manière sécurisée le changement de locale (qui nécessite souvent l’acquisition d’un mutex)
Optimisation de l’allocation des structures internes pendant l’analyse : la taille d’une entrée dans l’inventaire pour l’allocation de structure d’opérateur est réduite de 8 bits par opérateur sur les machines 64 bits
Corrections
Propagation des exceptions
Correction de la propagation des signaux lorsque $@
est forcé à une valeur numérique.
Normalement $@
contient le message d’erreur de l’exception. perl -e 'eval { die }; print $@'
nous donne Died at -e line 1.
.
Le problème c’est que dans le cas où on veut propager (donc une exception après une autre exception), une valeur numérique dans $@
est ignorée.
perl -e '$@ = 100; die'
donne
Died at -e line 1.
Or on voudrait quelque chose comme
perl -e '$@ = "100"; die'
qui donne
100 ...propagated at -e line 1.
donne
Died at -e line 1.
Exception en lecture seule, l’histoire sans fin
Un correctif sur un problème « amusant ».
Lorsqu’on met la variable $@
en read only et qu’une exception se déclenche, perl veut écrire dans $@
qui est read-only, ce qui génère une exception qui veut écrire dans $@
qui… vous avez compris le problème…
…Et ça se finissait en débordement de pile.
Autres
- Encore une correction sur les
0b…
et0x…
5.31.4
Améliorations du cœur de Perl
- Une amélioration pour les développeurs qui consiste à pouvoir séparer les étapes de compilation et d’optimisation des expressions rationnelles compilées (
qr/.../
). Il faut avoir compilé Perl en mode débogage.
Compilation
- Amélioration du script
Configure
pour la détection declang
et C++.
Corrections
correction d’une fuite mémoire dans les reconnaissances d’expressions rationnelles avec une chaîne de caractères UTF‑8 ;
encore du travail sur
0x
et0b
, décidément !
5.31.5
Améliorations du cœur de Perl
Les variables modifiables ne sont plus autorisées en contexte de constante. Ça signifie que
my $var; $sub = sub () { $var };
, qui était déprécié depuis 5.22, produit à présent une erreur si$var
est modifié dans une autre partie du code (il faut ajouter un return).Documentation des piles internes de l’interpréteur Perl
Documentation mise à jour pour utiliser HTTPD quand c’est possible
Nettoyage et mise à jour des vieux liens sur les courriels, etc.
Changements purement internes : ajout d’index pour garder l’ancienne position dans des piles Perl, des arguments en plus dans des macros en relation avec UTF‑8
Compilation
- Amélioration de Configure concernant
d_u32align
(défaut à oui, car la question n’est posée que sur machine 32 bits) etmalloc_usable_size
5.31.6
Améliorations du cœur de Perl
Script runs
Les script run ne sont plus expérimentales.
Un script run n’est probablement pas ce que vous pensez. En fait, il s’agit de contrôler que toute la séquence de caractères appartient au même script Unicode.
On peut écrire souvent les mêmes choses visuellement pour l’humain mais à partir d’un ensemble différent de caractères Unicode.
C’est assez critique car ça peut mener à du spoofing d’url.
Une expression rationnelle dans un script run va vérifier que tout ce qui est lu fait partie du même script.
Autres
Les assertions alpha ne sont plus expérimentales. Il s’agit des assertions d’expressions rationnelles du type lookbehind et lookahead qui sont non capturantes (cf. doc)
La vérification des fonctionnalités est plus rapide
Perl a migré vers GitHub (pas vraiment une amélioration du cœur de Perl, mais bon à noter). Cela comprend le dépôt Git et le système de suivi de bogues. Les rapports de bogue liés à la sécurité se font toujours en privé.
Un TRÈS gros travail a été fait sur le lexer. Un gros réusinage d’une très grosse fonction de 4 100 lignes avec un découpage en de multiples fonctions. Le résultat sera plus facile à comprendre et maintenir.
Le code qui gère la translitération (
tr///
) a été retravaillé entièrement avec de nombreux bogues corrigés (Unicode,/s
, autres).
Mise à jour des modules
- Un nouvel outil streamzip a été ajouté. Il permet de zipper ce qui est envoyé a l’entrée standard.
Compilation
- Correction d’un bogue dans
Configure
avec GCC 10
Corrections
- Une concaténation multiple entre une fonction mal définie et des chaînes lève bien un avertissement.
5.31.7
Améliorations du cœur de Perl
Introduction du nouvel opérateur
isa
. Ça doit parler aux programmeurs Perl puisque depuis looongtemps il existe un moduleUNIVERSAL
qui contient cette méthode et permet de faire de l’orienté objet. Mais voilà, là il s’agit d’ajouter un opérateur à Perl et non une méthode.Une propriété utilisateur dans un bloc de nom Unicode
\p{...}
sera toujours prioritaire par rapport à une propriété Unicode du même nom.L’outil
perlbug
qui sert à faire des rapports de bogues a été mis à jour pour pointer vers le système de suivi de GitHub.
Mise à jour des modules
- Le module B::Debug va bientôt sortir du cœur de Perl mais restera disponible dans le CPAN évidemment. C’est un module purement technique pour deparser et comprendre comment notre programme est interprété par perl
VStrings
Mise à jour de Storable avec un correctif interdisant les vstring de plus de deux gibioctets.
Mais au fait, qu’est‑ce qu’une vstring
?
Aucun rapport avec des chaînes qui serviraient à stocker des versions pour du semantic versioning.
C’est une façon d’écrire les chaînes de caractères en donnant leurs codes et en séparant par des .
(points).
Avec des vstring, on écrit par exemple v1.11;
qui est la même chose que chr(1) . chr(11)
.
Ça peut produire des résultats surprenants car dans un contexte de comparaison de chaînes (eq
), les chaînes v1.11
et v1.2
sont différentes, mais dans un contexte de comparaison numérique (==
) v1.1
et v1.2
seront évaluées en 0
et donc la comparaison sera vraie.
perl -e 'print v1.2+0'
donne 0
tout comme perl -e 'print v1.1+0'
donne 0
my $a = v1.11;
my $aa = chr(1) . chr(11);
my $b = v1.2;
my $bb = chr(1) . chr(2);
print "a == b\n" if ($a == $b);
print "a ne b\n" if ($a ne $b);
print "a == aa\n" if ($a == $aa);
print "a eq aa\n" if ($a eq $aa);
Qui nous donnera :
a == b # v1.11 == v1.2
a ne b # v1.11 ne v1.2
a == aa # v1.11 == chr(1) . chr(11)
a eq aa # v1.11 eq chr(1) . chr(11)
Compilation
- Correction pour la compilation sur Solaris avec Oracle Developer Studio compiler
Corrections
Correction mymalloc (déjà abordé) sur Windows
Pas vraiment un bogue, mais dans la doc Unicode, certains exemples fantaisistes étaient censés utiliser une propriété Unicode « bateau » qui n’existe pas, mais avec le temps certaines ont fini par apparaître. :) La doc a été mise à jour et les valeurs fautives remplacées par des noms qui ne devraient cette fois vraiment jamais exister.
Correction d’un bogue concernant les modificateurs d’expression rationnelles
/i
(insensible à la casse) et/l
(locale forcée).Problème dans les tests avec
make minitest
. C’est un jeu de tests exécuté avecminiperl
, qui est un interpréteurperl
capable de lire et d’exécuter du code Perl avant l’étape d’inclusion des interfaçages XS. Il est proposé d’étendre les « smoke tests » à cette cible pour éviter d’ignorer involontairement ce problème.Ajout d’une solution de contournement pour corriger un bogue dans glibc sur le changement de locales.
5.31.8
Améliorations du cœur de Perl
Tout comme pour
malloc
mentionné plus tôt, perl propose une autre implémentation destrlen
appelémy_strlen
mais cette fois destinée aux systèmes ne disposant pas pas destrlen
. L’implémentation demy_strlen
a été optimisée.D’autres améliorations de performances sur les fonctions
grok_*
. Les fonctions grok sont des fonctions de conversion.
Documentation
La documentation ne conseille plus d’utiliser le
malloc
de Perl. On part du principe que les implémentations modernes de malloc sont meilleures à présent.La documentation sur XS (interfacage avec code C) suggère aussi d’utiliser FFI (autre implémentation plus dynamique)
Eat your own dog food en quelque sorte : les exemples dans la doc perlipc sont à présent valides avec
use warnings; use strict;
Documentation des fonctions grok
Compilation
Rajout d’includes (
<stdlib.h>
et<stdio.h>
) à certaines sondes configurées pour rendre le code plus portable (éviter une erreur de compilation)Correction de la compilation de Perl sur NetBSD 8.0 avec g++.
Configure plus flexible sur Solaris, ce qui permet de compiler sur une plus grande variété de configurations Solaris.
Corrections
Correction d’un débordement de pile (heap overflow) dans ce genre d’expression rationnelle :
q0=~/0|\p{__::Is0}/
. L’origine du bogue est le fait que les soulignés vont produire en interne plusieurs noms pour la même propriété et le code confondait les deux noms.Correction d’un assertion failed sur les groupes non capturants dans les expressions rationnelles. Pour rappel, un groupe non capturant,
(?:...)
, et un exemple d’expression rationnelle qui crée cette assertion failed :/(?:0)|(?:)(?:[1-9])/
La fonction de translittération
tr///
a été beaucoup retouchée en 5.31 et une régression est apparue lorsqu’on utilise le modifier/d
. Ce modificateur est un modificateur interne qui permet de simuler un set de caractère ancien (et problématique).Correction d’un comportement défensif dans la gestion du comptage des références (gestion de la mémoire de Perl). Il s’agissait de ne pas décrémenter le nombre de références d’un objet si on s’apprête à mettre quelque chose dedans.
IO.xs devient thread safe
5.31.9
Améliorations du cœur de Perl
prise en charge d’Unicode 13 et de nouvelles propriétés Unicode
On dispose d’un nouvel alias pour les noms Unicode (mais attention, on ne peut pas faire les mêmes choses avec l’un ou avec l’autre)
Arrêt de la prise en charge de POSIX::mbstowcs et POSIX::wcstombs. Spécification cassée, aucune demande pour ces fonctions (les versions non sécurisées sans « s » restent supportées)
mise à jour des liens pointant vers
search.cpan.org
versmetacpan.org
Compilation
- Sur VMS, avec la publication d’un patch kit récent, de nombreuses nouvelles fonctions sont accessibles (dans
stdint.h
) et donc utilisées parperl
.
Corrections
require n’aime pas local %INC
Un correctif sur la valeur de retour de require
(un équivalent de use
qui s’exécute à l’exécution plutôt qu’à la compilation). Le bogue se produit lorsqu’on localise le hash des includes %INC
, donc lorsqu’on déclare un %INC
local
.
Qu’est‑ce que local
par rapport a my
?
Une variable déclarée avec my
est visible dans le bloc
donc { ... }
. On dit qu’elle est lexicale.
Une variable déclarée avec local
est visible dans l’arbre d’appel.
my $out = "out";
{
sub pin() {
print "[pin] in = $in\n";
}
my $in = "in";
print "[block] in = $in\n"; # Affiche in
print "[block] l = $l\n"; # Affiche rien
lout();
pin(); # Affiche rien
}
print "[out] out = $out\n"; # Affiche out
print "[out] in = $in\n"; # Affiche rien
sub lout() {
local $l = "local";
lin();
}
sub lin() {
print "[lin] l = $l\n"; # Affiche local
}
Autres
Correction d’un bogue sur les expressions rationnelles imbriquées qui produisent exceeded limit in regex.
En mode débogage, la compilation de propriétés Unicode pouvait produire certaines informations étranges, c’est corrigé.
5.31.10
Améliorations du cœur de Perl
- On peut à présent inclure des expressions rationnelles dans les noms Unicode, par exemple
r!\p{na=/(SMILING|GRINNING) FACE/}!
Opérateurs chaînes
Une comparaison chaînée comme $a < $b < $c
se comporte comme $a < $b && $b < $c
donc en deux temps, mais la valeur de $b
n’est pas recalculée (cas d’une variable attachée à une fonction instable par exemple).
Plus d’infos dans la doc.
Également, on ne pourra pas faire 1 .. 6 .. 9
car l’opérateur ..
n’est pas associatif.
Un petit fil de discussion sympa sur le sujet montre que le problème n’est pas tout à fait tranché.
5.31.11
La version 5.31.11 est une rc, elle est livrée par Sawyer X (qui est le pumpking actuel des versions majeures de Perl).
blead est gelée.
5.31.11 sert de base pour corriger les points bloquants avant 5.32.0
Un peu avant la sortie de perl 5.32.0, voici a quoi ressemble la « liste de points bloquants » :
5.32.0-RC0
Sortie de la RC0 le 30 mai 2020 (annonce).
5.32.0-RC1
Sortie le 7 juin 2020 (annonce).
5.32.0
Voici donc l’annonce de la sortie de Perl 5.32.0, que nous avons disséqué en long en large dans cette dépêche. :)
\o/ Tadaaa !
Conclusion
Pour terminer, juste une image pour remercier votre courage/abnégation d’avoir lu/scrollé jusqu’ici :)
J’espère pour vous que vous n’avez pas lu cette dépêche à haute voix…
Aller plus loin
- Perl (20 clics)
- MetaCPAN (9 clics)
- Perldelta 5.32.0 (dernier journal des modifications) (16 clics)
# Merci
Posté par zerodeux (site web personnel) . Évalué à 10.
Pour le boulot dantesque qu'a du être la rédaction de cette news. Un perl lover.
# Raku au cas où
Posté par raum_schiff . Évalué à 3.
Pour de l'aide sur P6 => Raku :
Sinon Elizabeth Mattijsen et Jonathan Worthington se feront un plaisir de répondre aux questions posées sur Raku.
Sawyer X fera de même en temps que Pumpking de P5.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.